package interfaz;

import dominio.*;
import java.util.*;

public class InterfazConsola {

    Sistema sistema;

    //Constructor
    public InterfazConsola(Sistema sistema) {
        this.sistema = sistema;
    }

    //Método que muestra el menú y las opciones del mismo al usuario
    public void iniciar() {
        int opcion = 0;
        boolean fin = false;

        while (!fin) {
            //Menú Principal
            System.out.println("         ********************"
                    + "\n         *  MENÚ PRINCIPAL  *"
                    + "\n         ********************");
            System.out.println("\n1- Configuración de la partida");
            System.out.println("2- Registrar jugador");
            System.out.println("3- Jugar a Pirámide");
            System.out.println("4- Mostrar el ranking de jugadores");
            System.out.println("5- Fin");



            opcion = pedirEntero("", 1, 5);

            //Opciones del Menú Principal
            switch (opcion) {
                case 1:
                    configurarPartida();
                    break;
                case 2:
                    Jugador j = registrarJugador();
                    sistema.addListaJugadores(j);
                    break;
                case 3:
                    Partida partida = configurarPartida();
                    jugarPiramide(partida);
                    break;
                case 4:
                    break;
                case 5:
                    fin = opcionFin("¿Está seguro que desea salir? (S/N) ");
                    if (fin == true) {
                        System.out.println("Esperamos que se haya divertido!\n");
                        break;
                    }
            }
        }
    }

    
    //Método para configurar partida - Opción 1 del Menú
    public Partida configurarPartida() {
        int tamañoTablero = IndicaTamañoTablero();
        boolean esEscalera = distribucionDeTableros();
        Partida partida = new Partida(tamañoTablero, esEscalera);        
        partida.setLargoLinea(largoLinea(tamañoTablero));
        return partida;
    }

    //Pide al usuario el tamaño del tablero que desea crear
    public int IndicaTamañoTablero() {
        System.out.println("\nEl tamaño del tablero debe ser entre 3 y 8. ");
        int tamaño = pedirEntero("\nIngrese el tamaño del tablero que desea crear: ", 3, 8);
        return tamaño;
    }

    //Método que pide los datos del largo de la línea
    public int largoLinea(int tamañoTablero) {
        int largoLinea = pedirEntero("\nIngrese el tamaño de la línea que desea formar: ", 3, tamañoTablero);
        return largoLinea;
    }

    //Método que pregunta al usuario la distribución de los tableros
    public boolean distribucionDeTableros() {
        boolean escalera = false;
        boolean datoCorrecto = false;
        System.out.println("Seleccione la distribución que desea para los tableros (aleatorio o escalera): ");
        do {
            String esEscalera = pedirTexto();
            if (esEscalera.trim().equalsIgnoreCase("escalera")) {
                escalera = true;
                datoCorrecto = true;
            } else if (esEscalera.trim().equalsIgnoreCase("aleatorio")) {
                escalera = false;
                datoCorrecto = true;
            } else {
                System.out.println("El dato ingresado no es correcto. Vuelva a indicarlo: ");
                datoCorrecto = false;
            }
        } while (!datoCorrecto);

        return escalera;
    }

    //Método que registra un jugador - Opción 2 del Menú
    public Jugador registrarJugador() {
        Jugador jugador = new Jugador();
        System.out.println("Ingrese su nombre: ");
        jugador.setNombre(pedirTexto());
        System.out.println("\nIngrese su alias: ");
        jugador.setAlias(pedirTexto());
        jugador.setEdad(pedirEntero("\nIngrese su edad: ", 5, 100));
        return jugador;
    }
    
    
    //Método Jugar Pirámide - Opción 3 del Menú
    public void jugarPiramide(Partida partida){
        ArrayList<Jugador> listaJugadores = sistema.getListaJugadores();
        if(!(listaJugadores.isEmpty())){
            System.out.println("Seleccione un jugador de la lista: \n");
            mostrarLista(listaJugadores);
            int datoIngresado = pedirEntero("", 1, listaJugadores.size());
            partida.setJugador1(listaJugadores.get(datoIngresado));
            partida.getJugador1().getFicha().setColorFicha('R');
            System.out.println("Seleccione otro jugador de la lista: \n");
            datoIngresado = pedirEntero("", 1, listaJugadores.size());
            partida.setJugador2(listaJugadores.get(datoIngresado));
            partida.getJugador2().getFicha().setColorFicha('A');
        }
        else{
            System.out.println("No hay jugadores ingresados en el sistema. ");
        }
    }
    
    
    //Método que muestra una lista
    public void mostrarLista(ArrayList listaObjetos){
        for(int i=0; i<listaObjetos.size(); i++){
            Object objeto = listaObjetos.get(i);
            System.out.println((i+1) + "-" + objeto);
        }
    }
    

    //Validador para salir - Opción 5 del Menú
    public boolean opcionFin(String unTexto) {
        boolean seleccion = true;
        Scanner in = new Scanner(System.in);
        String opcionFin;
        System.out.println(unTexto);
        opcionFin = in.next();
        while ((!(opcionFin.equalsIgnoreCase("S") || opcionFin.equalsIgnoreCase("N")))) {
            System.out.println("Indique una opción correcta:  S/N");
            opcionFin = in.next();
        }
        if (opcionFin.equalsIgnoreCase("N")) {
            seleccion = false;
        }
        return seleccion;
    }

    //Método para dibujar el tablero de juego
    public static void dibujarTablero(Ficha[][] tablero) {
        int medida = tablero.length;
        System.out.println("\n");
        for (int i = -2; i < medida * 2 - 1; i++) {
            for (int j = -1; j < medida; j++) {
                int fila = i < 0 ? 0 : i;
                int col = j < 0 ? 0 : j;
                //En par imprine el nivel
                if (i % 2 == 0) {
                    System.out.print(tablero[fila / 2][col].getNivel());
                    if (col + 1 != medida) {
                        System.out.print(" - ");
                    }
                    //if (col == 0) {
                    //}                    
                    //En impar imprime la ficha
                } else {
                    if (col == 0) {
                    }
                    System.out.print("|");
                    if (i - 1 != medida * 2 && j + 1 != medida) {
                        System.out.print(" " + tablero[(i + 1) / 2][j + 1].getColorFicha() + " ");
                    }
                }
                if (col + 1 == medida) {
                    System.out.println(" ");
                }
            }
        }
    }

    //Método para pedirle datos String al usuario.
    public static String pedirTexto() {
        Scanner in = new Scanner(System.in);
        String texto = in.nextLine();
        return texto;
    }

    //Validador de datos numéricos
    public int pedirEntero(String mensaje, int inferior, int superior) {
        Scanner in = new Scanner(System.in);
        boolean ok = false;
        int dato = 0;
        while (!ok) {
            try {
                System.out.println(mensaje);
                dato = in.nextInt();
                if (dato < inferior || dato > superior) {
                    System.out.println("Debe ingresar un número entre " + inferior + " y " + superior);
                } else {
                    ok = true;
                }
            } catch (InputMismatchException e) {
                System.out.println("Por favor ingrese sólo números.\n");
                in.next();
            }
        }
        return dato;
    }
}